# Converions textes ↔ nombre

## Introduction

Depuis les premiers programmes les fonctions `int` et `str` sont utilisées
pour respectivement "convertir" une chaîne de caractères (telles qu'elle pourrait
être saisie par l'utilisateur) en nombre et inversement (pour affichage).

L'objectif de cette activité d'approfondissement est de reprogrammer ces fonctions
pour comprendre le mécanisme opéré. L'utilisation des fonctions `int` et `str`
du python est interdite.


## Représentation mémoire

Il est intéressant en premier lieu de comprendre qu'en mémoire, une chaîne
de caractère représentant en nombre n'est pas la même chose que le nombre
lui-même. Les fonctions suivantes permettent un affichage hexadécimal d'un
nombre (représenté sur 32 bits / 4 octets / 8 caractères hexadécimaux) et
un texte :

```python
hexInt32 = lambda v: v.to_bytes(4,'big').hex() #4 = 32 // 8
hexStr = lambda v: v.encode().hex()
```

Expérimentation :

```python
chaine = input("Saisir un nombre compris entre 0 et 2**32 (4 milliards) : ")
nombre = int(chaine)

print(hexStr(chaine))
print(hexInt32(nombre))
```

Expliquer le résultat obtenu.


## Fonction "int"

Cette fonction à compléter convertit une chaîne de caractères en nombre.

L'algorithme consiste à parcourir la chaîne caractère par caractère :

- pour chaque caractère, on utilise la table ASCII pour obtenir sa valeur
numérique à laquelle on soustrait 48 — cf : ord("0") = 48, ord("1") = 49…
- le nombre ainsi obtenu doit être multiplié par la puissance de 10 correspondant
à son ranf et ajouté au total.
	
Exemple "456" :

- le premier caractère de la chaîne est "4" (52 dans la table ASCII) ; 52 - 48
est bien égal à 4 ; 4 * 10**2 = 400 (rappel : 10**2 = 10²) ;
- le second caractère est "5" ; 5 * 10**1 = 50 ; 400 + 50 = 450 ;
- le troisième caractère est "6" ; 6 * 10**0 = 6 ; 450 + 6 = 456.
	
Il faut une variable pour déterminer la puissance de 10 à appliquer ; remarquer
que pour l'exemple "123", elle vaut 2, 1, puis 0. Pour le nombre "2048", la
puissance serait 3, 2, 1 et enfin 0…

```
def str2int(text: str) -> int:
	"""
	Convertit une chaîne de caractères représentant un nombre en entier (cf fonction int)
	@param text la chaîne de caractères représentant le nombre
	@return le nombre entier correspondant
	préconditions: le texte représente un nombre entier (sans autres caractères
	que des chiffres éventuellements précédés de "-")
	>>> str2int("0")
	0
	>>> str2int("1")
	1
	>>> str2int("123")
	123
	>>> str2int("-1024")
	-1024
	"""
	assert text.lstrip("-").isnumeric()	#précondition
	
	#A COMPLETER
```
	

## Fonction "str"

Cette fonction convertit un nombre en chaîne de caractères. une stratégie
consiste à diviser plusieurs fois le nombre par 10 (jusqu'à ce que le quotient
soit 0) en récupérant les restes (de la division) ; ici encore, utiliser la
table ASCII pour reconstruire la chaîne de caractères.

Exemple : 713

- 713 % 10 = 3 (reste) ; chr(3 + 48) = "3" ; 713 // 10 = 71 (quotient) ;
- 71 % 10 = 1…
- 7 % 10 = 7…

```python
def int2str(value: int) -> str:
	"""
	Convertit un nombre en une chaîne de caractères le représentant (cf fonction str)
	@param value un nombre entier
	@return la chaîne de caractères représentant le nombre
	>>> int2str(0)
	'0'
	>>> int2str(1)
	'1'
	>>> int2str(123)
	'123'
	>>> int2str(-1024)
	'-1024'
	"""
	
	#A COMPLETER
```
